using System.Diagnostics;
using PostSharp.Aspects;
namespace ILWeaving;
//创建自定义切面属性
[Serializable]
public class LogAspect : OnMethodBoundaryAspect
{
    // 可选：可以在这里初始化一些静态数据
    public override void RuntimeInitialize(System.Reflection.MethodBase method)
    {
        Console.WriteLine($"初始化切面，目标方法: {method.DeclaringType.Name}.{method.Name}");
    }

    // 方法执行前
    public override void OnEntry(MethodExecutionArgs args)
    {
        Console.WriteLine($"进入方法: {args.Method.DeclaringType.Name}.{args.Method.Name}");
        Console.WriteLine($"参数: {string.Join(", ", args.Arguments)}");
        
        // 记录开始时间
        args.MethodExecutionTag = Stopwatch.StartNew();
    }

    // 方法执行成功完成后
    public override void OnSuccess(MethodExecutionArgs args)
    {
        var stopwatch = (Stopwatch)args.MethodExecutionTag;
        stopwatch.Stop();
        
        Console.WriteLine($"方法成功完成: {args.Method.Name}, 耗时: {stopwatch.ElapsedMilliseconds}ms");
        
        if (args.ReturnValue != null)
        {
            Console.WriteLine($"返回值: {args.ReturnValue}");
        }
    }

    // 方法抛出异常时
    public override void OnException(MethodExecutionArgs args)
    {
        Console.WriteLine($"方法 {args.Method.Name} 抛出异常: {args.Exception.Message}");
        
        // 可以选择不重新抛出异常
        // args.FlowBehavior = FlowBehavior.Return;
    }

    // 方法执行后（无论成功或失败）
    public override void OnExit(MethodExecutionArgs args)
    {
        Console.WriteLine($"退出方法: {args.Method.Name}");
    }
}